package com.tsmti.activiti.service;

import com.tsmti.activiti.dto.ActUserDto;
import com.tsmti.activiti.dto.ProcessNodeDto;
import com.tsmti.activiti.dto.ProcessTaskDto;
import com.tsmti.activiti.dto.WorkflowInfoDto;
import com.tsmti.activiti.entity.ExtendActModel;
import com.tsmti.core.common.query.data.Page;
import com.tsmti.core.common.query.data.Queryable;
import org.springframework.http.ResponseEntity;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Package：com.tsmti.activiti.service
 * @Class：ActModelerService
 * @Description： activiti模型接口类
 * @Author：zcw
 * @Date：Created in 2018/8/16 16:49
 * @Company:
 * @Version：
 * @Modified By:
 *
 */
public interface ActModelerService {

    /**
     * 创建模型
     * @param extendActModel 模型
     * @return 创建模型
     * @throws Exception 异常
     */
    ExtendActModel createModeler(ExtendActModel extendActModel) throws  Exception;

    /**
     * 获取流程图所有节点和连线
     * @param modelId 模型id
     * @return 获取流程图所有节点和连线
     * @throws Exception 异常
     */
    List<Map<String,String>> getflows(String modelId) throws Exception;

    /**
     * 查看流程图片
     * @param modelId 模型id
     * @return 查看流程图片
     */
    ResponseEntity<byte[]> showFlowImg(String modelId);

    /**
     * 根据流程key 获取业务可用的流程
     * @param actKey 流程key
     * @return 获取业务可用的流程
     */
    List<Map<String,Object>> queryFlowsByActKey(String actKey);

    /**
     * 获取流程第一个节点信息
     * @param deployId 流程
     * @throws IOException 抛出该异常
     * @return 获取流程第一个节点信息
     */
    WorkflowInfoDto getStartFlowInfo(String deployId) throws IOException;

    /**
     * 根据节点id分页查询可以选择的审批人
     * @param queryable 查询参数
     * @param params 查询参数
     * @return 根据节点id分页查询可以选择的审批人
     */
    Page<ActUserDto> userWindowPage(Map<String, Object> params, Queryable queryable);

    /**
     * 查询列表
     * @param params 参数
     * @param queryable 查询参数
     * @return 查询列表
     */
    Page<ActUserDto> turnWindowList(Map<String, Object> params, Queryable queryable);

    /**
     * 启动流程
     * @param processTaskDto dto
     * @throws Exception 抛出该异常
     */
    void startFlow(ProcessTaskDto processTaskDto) throws Exception;

    /**
     * 根据流程实例id查询实时的流程图
     * @param processInstanceId 流程实例id
     * @return 实时的流程图
     */
    InputStream getFlowImgByInstantId(String processInstanceId);

    /**
     * 我的待办列表
     * @param params 查询参数
     * @param queryable 查询参数
     * @return 我的待办列表
     */
    Page<ProcessTaskDto> findMyUpcomingPage(Map<String,Object> params,Queryable queryable);

    /**
     * 我的代办条数
     * @return 我的代办条数
     */
    long myUpcomingCount();


    /**
     * 我的已办列表
     * @param params 查询参数
     * @param queryable 查询参数
     * @return 我的已办列表
     */
    Page<ExtendActModel> myDonePage(Map<String, Object> params, Queryable queryable) ;



    /**
     * 根据流程节点id 获取流程下一流向节点集合
     * @param processTaskDto dto
     * @return 获取流程下一流向节点集合
     */
    List<ProcessNodeDto> getNextActNodes(ProcessTaskDto processTaskDto);

    /**
     * 根据当前节点,获取下一流向所有的字段变量名
     * @param nodeId 当前节点id
     * @param defId 流程定义id
     * @return 获取下一流向所有的字段变量名
     */
    Set<String> getNextVarNams(String nodeId, String defId);

    /**
     * 办理任务
     * @param processTaskDto dto
     * @param params 参数
     * @throws Exception 抛出该异常
     */
    void doActTask(ProcessTaskDto processTaskDto, Map<String, Object> params) throws Exception;

    /**
     * 驳回到流程上一步
     * @param processTaskDto dto
     */
    void backPreviousNode(ProcessTaskDto processTaskDto);

    /**
     * 不同意,直接结束流程,业务记录进入可编辑状态，可以修改业务数据后再提交流程
     * @param processTaskDto dto
     * @param map map
     * @throws Exception 抛出该异常
     */
    void endFailFolw(ProcessTaskDto processTaskDto, Map<String, Object> map) throws Exception;

    /**
     * 转办
     * @param processTaskDto dto
     * @param toUserId 被转办人
     */
    void turnToDo(ProcessTaskDto processTaskDto, String toUserId);

    /***
     * 流程办理人
     * @param params 查询参数
     * @param queryable 查询参数
     * @return 流程办理人
     */
    Page<ActUserDto> findActUser(Map<String, Object> params, Queryable queryable);

}
